package com.t.bricks.bussiness.service.rightmanage.impl;

import javax.annotation.PostConstruct;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.t.bricks.annotation.CacheClear;
import com.t.bricks.annotation.CacheRebuild;
import com.t.bricks.bussiness.db.entity.rightmanage.RightManage;
import com.t.bricks.bussiness.db.mapper.rightmanage.RightManageMapper;
import com.t.bricks.bussiness.service.rightmanage.RightManageService;
import com.t.bricks.model.Log;
import com.t.bricks.model.MsgEmity;
import com.t.bricks.utils.spring.ModuleUtil;

/**
 * 权限管理'RightManage表'基本业务操作类接口实现
 */
@Service
public class RightManageServiceImpl implements RightManageService<RightManage> {
	
	@Autowired
	private RightManageMapper rightManageMapper;

	/**
	 * 启动时检查建立缓存
	 */
	@PostConstruct
	private void autoRun() {
		this.findByTree();
	}
	
	/**
	 * 新增
	 * @param rightManage 权限管理 对象实体,注意:跨包访问时可能会是json字符串
	 * @return
	 */
	@Override
	@CacheRebuild(core="RightManage", type="tree", key="all", rebuildMethod="findByTree")
	public MsgEmity add(Object rightManage) {
		MsgEmity me = ModuleUtil.objToEntity(rightManage, RightManage.class);//转换数据,因为如果传递的是String,则可能是进行了跨包访问,要先用Json转换成实体对象
		if (!me.isSuccess()) {
			return me;
		}
		
		RightManage rightManageData = me.getData();
		
		if (null == rightManageData.getsPid() || "".equals(rightManageData.getsPid().trim())) {
			rightManageData.setsPid("00");
		}
		
		if (!"00".equals(rightManageData.getsPid())) {
			rightManageData.setsRightId(null);
		}
		
		//--如果没有设定权限,则后续进行默认权限--//
		String tempRightId = null;
		if (null == rightManageData.getsRightId() || "".equals(rightManageData.getsRightId())) {
			tempRightId = String.valueOf(System.currentTimeMillis());
			rightManageData.setsRightId(tempRightId);//随意给一个值,后续操作会对其重新赋值
			rightManageData.setsId(tempRightId);//清空记录编号
		}
		
		me = ModuleUtil.validDbEntityByAdd(rightManageData);// 通用的基本数据验证,如果要进行比较复杂的数据验证则可以屏蔽掉此方法自行编写
		if (!me.isSuccess()) {
			return me;
		}
		
		me = this.validByAdd(rightManageData);//验证树形数据待新增的数据是否重复
		if (!me.isSuccess()) {// 在false下,如果返回8028则表示数据库查询异常,否则返回后4位是8026的数据,如xxx8026,从万位起表示从数据库中查询的结果
			return analyseCheckCode(me);
		}
		
		if (null != tempRightId) {
			rightManageData.setsId(null);//清空记录编号
			rightManageData.setsRightId(null);//清空权限编号
		}
		
		synchronized(this) {//由于采用补漏的方式获取节点编号,因此在未保存前存在id冲突的可能
			String vNewId = null;
			
			if (null != tempRightId) {
				me = this.newChildId(rightManageData.getsPid());
				if (!me.isSuccess()) {
					return me;
				}
				
				vNewId = me.getData();
			} else {
				vNewId = rightManageData.getsRightId();
			}
			
			rightManageData.setsId(vNewId);//补充id
			rightManageData.setsRightId(vNewId);//补充权限
			
			me = ModuleUtil.supplyDbEntityAttrByAdd(rightManageData, vNewId, null);// 补充数据,如添加id、当前用户、当前时间等
			if (!me.isSuccess()) {
				return me;
			}
	
			//--提交数据保存--//
			int iErrCode = 7004;//错误码值
			try {
				int i = rightManageMapper.add(rightManageData);
				if (i < 1) {
					Log.error("新增未能得到预期影响值(预期1):", i);
					return new MsgEmity(false, "新增数据失败！", 7001);//此时不需要回滚
				}
			} catch (Exception e) {
				Log.error("新增时发生异常:", e.getMessage());
				return new MsgEmity(false, "新增失败！", iErrCode);
			}
			
			return new MsgEmity(true, "新增成功！", rightManageData);
		}
	}

	/**
	 * 修改
	 * @param rightManage 权限管理 对象实体,注意:跨包访问时可能会是json字符串
	 * @return
	 */
	@Override
	@CacheRebuild(core="RightManage", type="tree", key="all", rebuildMethod="findByTree")
	public MsgEmity edit(Object rightManage) {
		MsgEmity me = ModuleUtil.objToEntity(rightManage, RightManage.class);//转换数据,因为如果传递的是String,则可能是进行了跨包访问,要先用Json转换成实体对象
		if (!me.isSuccess()) {
			return me;
		}
		
		RightManage rightManageData = me.getData();
		
		if (null == rightManageData.getsPid() || "".equals(rightManageData.getsPid().trim())) {
			rightManageData.setsPid("00");
		}
		
		me = ModuleUtil.validBaseDataByEdit(rightManageData);// 通用的基本数据验证(编辑),如果要进行比较复杂的数据验证则可以屏蔽掉此方法自行编写
		if (!me.isSuccess()) {
			return me;
		}
		
		me = this.validByEdit(rightManageData);//检查待修改内容是否存在重复数据(单独字段重复即重复)
		if (!me.isSuccess()) {// 在false下,如果返回8028则表示数据库查询异常,否则返回后4位是8026的数据,如xxx8026,从万位起表示从数据库中查询的结果
			return analyseCheckCode(me);
		}
		
		ModuleUtil.supplyDbEntityAttrByEdit(rightManageData);// 补充数据
		
		//--提交数据保存--//
		return this.edit(rightManageData, false);
	}
	
	/**
	 * 分析检查码
	 * @param me
	 * @return
	 */
	private MsgEmity analyseCheckCode(MsgEmity me) {
		switch (me.getData().toString().length()) {// 数据一定不小于4位,如10118026
		case 8:
			return MsgEmity.err(8031, "同父节下不允许存在相同名称节点");
		case 7:
			return MsgEmity.err(8032, "唯一标识重复");
		case 6:
			return MsgEmity.err(8033, "权限值重复");
		case 5:
			return MsgEmity.err(8034, "主键重复");
		default:
			return me;
		}
	}
	
//	/**
//	 * 查询权限管理树信息(给前端返回树形结构权限数据)
//	 * @return
//	 */
//	@Override
//	@CacheLoad(core="RightManage", type="tree")
//	public synchronized MsgEmity findByTree() {
//		return BaseServiceUtil.findByTree(this);
//	}
	
	/**
	 * 清理缓存
	 * @return
	 */
	@Override
	@CacheClear(core="RightManage", type="tree")
	public MsgEmity clearCache() {
		return MsgEmity.success(8999, "接受请求");
	}

}
